package org.ch02.hw.demo08;

import org.ch02.entity.Student;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @author ZJL
 * @date 2025-03-19
 */
public class MainTest01 {
    public static void main(String[] args) throws Exception {
//        八、使用反射，创建一个学生类型的数组，存放二个学生，循环遍历输出，要求如下：
//        1、第一个学生要求使用默认构造方法实例化并使用用 set 方法初始化对象
//
//        2、第二个学生要求使用下面的构造方法实例化对象
//        Student(String name,int age,Double score)

        // 创建一个用于存储 Student 对象的一维数组 ，一共存储两个元素
        Object arr = Array.newInstance(Student.class, 2);

        // 获取操作类的 Class 对象
        Class<Student> studentClass = Student.class;
        Student s1  = studentClass.getConstructor().newInstance();

        Field nameField = studentClass.getDeclaredField("name");
        Field ageField = studentClass.getDeclaredField("age");
        Field scoreField = studentClass.getDeclaredField("score");

        // 开启权限
        nameField.setAccessible(true);
        ageField.setAccessible(true);
        scoreField.setAccessible(true);

        // 调用 setter 方法
        nameField.set(s1,"张三");
        ageField.set(s1,18);
        scoreField.set(s1,99.5);

        Student s2 = studentClass.getConstructor(String.class, int.class, Double.class).newInstance("李四", 21, 88.5);

        Array.set(arr, 0, s1);
        Array.set(arr, 1, s2);

        // 循环遍历数组
        for (int i = 0; i < Array.getLength(arr); i++) {
            Student s = (Student) Array.get(arr, i);
            System.out.println(s);
        }
    }
}
